package org.example.lambda;

/**
 *  Lambda 表达式，我们提到如果接口中只有一个抽象方法（可以包含多个默认方法或多个 static 方法，包含Object里的public方法），那么该接口就是函数式接口。
 *  这种类型的接口也称为SAM接口，即Single Abstract Method interfaces。它们主要用在Lambda表达式和方法引用上。
 *
 *  @FunctionalInterface 就是用来指定某个接口必须是函数式接口，所以 @FunctionalInterface 只能修饰接口，不能修饰其它程序元素。
 *  @FunctionalInterface 注解主要是帮助程序员避免一些低级错误，例如，接口中再增加一个抽象方法 otherFun()
 *
 *  注：Object里的public方法，这些方法对于函数式接口来说，不被当成是抽象方法（虽然它们是抽象方法）；
 *  因为任何一个函数式接口的实现，默认都继承了Object类，包含了来自java.lang.Object里对这些抽象方法的实现；
 */
@FunctionalInterface
public interface MyFirstFunInterFace {
    static void staticFunc() {
        System.out.println("my static func");
    }
    default void defaultFunc() {
        System.out.println("my defalut func");
    }
    void onlyOneFun(); // 只定义一个抽象方法

    @Override
    boolean equals(Object obj);

}
